using System;
using System.Threading.Tasks;
using LibreHardwareMonitor.Hardware;

namespace MemGuardian
{
    /// <summary>
    /// 简化温度监控器类
    /// 使用LibreHardwareMonitor库获取硬件温度信息
    /// 支持CPU、GPU、硬盘等主要硬件的温度监控
    /// </summary>
    public class SimpleTemperatureMonitor : IDisposable
    {
        #region 私有字段

        /// <summary>
        /// LibreHardwareMonitor的Computer实例
        /// 用于访问和管理硬件传感器
        /// </summary>
        private Computer? computer;

        /// <summary>
        /// 释放标志，确保资源只被释放一次
        /// </summary>
        private bool disposed = false;

        #endregion

        #region 构造函数

        /// <summary>
        /// SimpleTemperatureMonitor构造函数
        /// 初始化LibreHardwareMonitor并配置要监控的硬件类型
        /// </summary>
        public SimpleTemperatureMonitor()
        {
            try
            {
                // 创建Computer实例并配置要监控的硬件类型
                computer = new Computer
                {
                    IsCpuEnabled = true,        // 启用CPU监控
                    IsGpuEnabled = true,        // 启用GPU监控（NVIDIA、AMD、Intel）
                    IsStorageEnabled = true,    // 启用存储设备监控
                    IsMotherboardEnabled = true, // 启用主板监控
                    IsMemoryEnabled = true,     // 启用内存监控
                    IsNetworkEnabled = false,   // 禁用网络监控（不需要）
                    IsControllerEnabled = true  // 启用控制器监控
                };
                
                // 打开硬件监控连接
                computer.Open();
                
                // 温度监控器初始化成功
            }
            catch
            {
                // 如果初始化失败，将computer设置为null
                // 这可能是由于权限不足或硬件不支持等原因
                computer = null;
            }
        }

        #endregion

        #region 公共方法

        /// <summary>
        /// 异步获取硬件温度信息
        /// 返回CPU、GPU、硬盘的最高温度值
        /// </summary>
        /// <returns>包含CPU、GPU、硬盘温度的元组</returns>
        public async Task<(float CpuTemperature, float GpuTemperature, float HddTemperature)> GetTemperaturesAsync()
        {
            // 如果Computer实例不可用，返回默认值
            if (computer == null)
            {
                return (0, 0, 0);
            }
            
            // 在后台线程中执行温度获取操作，避免阻塞UI线程
            return await Task.Run(() =>
            {
                float cpuTemp = 0, gpuTemp = 0, hddTemp = 0;
                
                try
                {
                    // 遍历所有硬件设备
                    foreach (var hardware in computer.Hardware)
                    {
                        // 更新硬件信息
                        hardware.Update();
                        
                        // 遍历硬件设备的所有传感器
                        foreach (var sensor in hardware.Sensors)
                        {
                            // 只处理温度传感器
                            if (sensor.SensorType == SensorType.Temperature && sensor.Value.HasValue)
                            {
                                float temp = sensor.Value.Value;
                                
                                // 根据硬件类型分类温度值
                                switch (hardware.HardwareType)
                                {
                                    case HardwareType.Cpu:
                                        // 对于CPU，取最高温度值
                                        if (cpuTemp == 0 || temp > cpuTemp)
                                        {
                                            cpuTemp = temp;
                                        }
                                        break;
                                        
                                    case HardwareType.GpuNvidia:
                                    case HardwareType.GpuAmd:
                                    case HardwareType.GpuIntel:
                                        // 对于GPU，取最高温度值
                                        if (gpuTemp == 0 || temp > gpuTemp)
                                        {
                                            gpuTemp = temp;
                                        }
                                        break;
                                        
                                    case HardwareType.Storage:
                                        // 对于存储设备，取最高温度值
                                        if (hddTemp == 0 || temp > hddTemp)
                                        {
                                            hddTemp = temp;
                                        }
                                        break;
                                }
                            }
                        }
                    }
                }
                catch
                {
                    // 如果获取温度时出错，静默处理
                    // 返回的值将保持为0
                }
                
                return (cpuTemp, gpuTemp, hddTemp);
            });
        }

        #endregion

        #region IDisposable实现

        /// <summary>
        /// 释放资源
        /// 关闭LibreHardwareMonitor连接并清理资源
        /// </summary>
        public void Dispose()
        {
            if (!disposed)
            {
                // 关闭Computer连接
                computer?.Close();
                
                // 清理引用
                computer = null;
                
                // 标记为已释放
                disposed = true;
            }
        }

        #endregion
    }
}
